package net.linku.annotation.config;

import java.lang.reflect.Method;

/**
 * 封装在表达式语言 (SpEL) 中用于创建评估上下文的根对象。
 * <p>
 * 该类封装了方法、参数、目标对象以及目标方法等信息，用于在表达式评估时提供上下文数据。
 * 在进行表达式评估时，SpEL 引擎需要这些信息来解析和计算表达式。
 * </p>
 *
 * @author SilenceTian
 * @date 2024/7/21
 */
public class LinkUExpressionRootObject {

    /** 当前被评估的方法 */
    private final Method method;

    /** 调用方法时传递的参数 */
    private final Object[] args;

    /** 方法的目标对象，即方法被调用的实例 */
    private final Object target;

    /** 目标对象的类 */
    private final Class<?> targetClass;

    /** 目标类中实际被调用的方法，可能经过了 AOP 代理处理 */
    private final Method targetMethod;

    /**
     * 构造函数，用于初始化 {@code BladeExpressionRootObject} 实例。
     *
     * @param method 当前被评估的方法
     * @param args 调用方法时传递的参数
     * @param target 方法的目标对象
     * @param targetClass 目标对象的类
     * @param targetMethod 目标类中实际被调用的方法
     */
    public LinkUExpressionRootObject(final Method method, final Object[] args, final Object target, final Class<?> targetClass, final Method targetMethod) {
        this.method = method;
        this.args = args;
        this.target = target;
        this.targetClass = targetClass;
        this.targetMethod = targetMethod;
    }

    /**
     * 获取当前被评估的方法。
     *
     * @return 当前被评估的方法
     */
    public Method getMethod() {
        return this.method;
    }

    /**
     * 获取调用方法时传递的参数。
     *
     * @return 调用方法时传递的参数
     */
    public Object[] getArgs() {
        return this.args;
    }

    /**
     * 获取方法的目标对象，即方法被调用的实例。
     *
     * @return 方法的目标对象
     */
    public Object getTarget() {
        return this.target;
    }

    /**
     * 获取目标对象的类。
     *
     * @return 目标对象的类
     */
    public Class<?> getTargetClass() {
        return this.targetClass;
    }

    /**
     * 获取目标类中实际被调用的方法，可能经过了 AOP 代理处理。
     *
     * @return 目标类中实际被调用的方法
     */
    public Method getTargetMethod() {
        return this.targetMethod;
    }
}
